/*
 * MIT License
 *
 * Copyright (c) 2024 恩爸编程
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.enba.boot.oss.config;

import com.enba.boot.core.base.ShowBootInfo;
import com.enba.boot.oss.FileUploadHelper;
import com.enba.boot.oss.properties.FileUploadProperties;
import com.enba.boot.oss.strategy.AliyunOssUploadStrategy;
import com.enba.boot.oss.strategy.FileUploadStrategy;
import com.enba.boot.oss.strategy.HuaweiObsUploadStrategy;
import com.enba.boot.oss.strategy.MinioUploadStrategy;
import com.enba.boot.oss.strategy.TencentCosUploadStrategy;
import javax.annotation.PostConstruct;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan(basePackages = "com.enba.boot.oss")
@Configuration
@EnableConfigurationProperties(FileUploadProperties.class)
public class FileUploadConfig implements ShowBootInfo {

  @Bean
  public FileUploadStrategy fileUploadStrategy(FileUploadProperties fileUploadProperties) {
    String provider = fileUploadProperties.getProvider();
    if ("aliyun".equals(provider)) {

      FileUploadProperties.AliyunOssProperties aliyunOss = fileUploadProperties.getAliyunOss();
      return new AliyunOssUploadStrategy(
          aliyunOss.getEndpoint(), aliyunOss.getAccessKeyId(), aliyunOss.getAccessKeySecret());
    } else if ("tencent".equals(provider)) {

      FileUploadProperties.TencentCosProperties tencentCos = fileUploadProperties.getTencentCos();
      return new TencentCosUploadStrategy(
          tencentCos.getRegion(), tencentCos.getAccessKeyId(), tencentCos.getAccessKeySecret());
    } else if ("huawei".equals(provider)) {

      FileUploadProperties.HuaweiObsProperties huaweiObs = fileUploadProperties.getHuaweiObs();
      return new HuaweiObsUploadStrategy(
          huaweiObs.getEndpoint(), huaweiObs.getAccessKey(), huaweiObs.getSecretKey());
    } else if ("minio".equals(provider)) {

      FileUploadProperties.MinioProperties minio = fileUploadProperties.getMinio();
      return new MinioUploadStrategy(
          minio.getEndpoint(), minio.getAccessKey(), minio.getSecretKey());
    }

    throw new UnsupportedOperationException("不支持的提供商：" + provider);
  }

  @Bean
  public FileUploadHelper fileUploadService(FileUploadStrategy fileUploadStrategy) {
    return new FileUploadHelper(fileUploadStrategy);
  }

  @PostConstruct
  @Override
  public void showBootInfo() {
    ShowBootInfo.moduleMap.put("enba-boot-starter-oss", "enba-boot-starter-oss模块集成成功");
  }
}
